import psutil
import time


def get_top_cpu_processes(n=5):
    print("正在获取 CPU 使用情况，请稍候 ...")

    # 暂停 1 秒，确保获取到第一次 CPU 使用百分比数据
    time.sleep(1)

    # 第一次调用 CPU 占用，初始化所有进程的 CPU 使用情况
    for proc in psutil.process_iter(['pid', 'name']):
        try:
            proc.cpu_percent(interval=None)  # 初始化
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue

            # 等待 1 秒以便获得准确数据
    time.sleep(1)

    # 获取当前运行的进程信息
    process_list = []
    for proc in psutil.process_iter(['pid', 'name']):
        try:
            # 获取进程的 CPU 使用率
            proc_cpu_usage = proc.cpu_percent(interval=None)  # 再次获取数据
            process_list.append({
                'pid': proc.info['pid'],
                'name': proc.info['name'],
                'cpu_percent': proc_cpu_usage
            })
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue

            # 按 CPU 占用率降序排序并获取前 n 个进程
    top_processes = sorted(process_list, key=lambda p: p['cpu_percent'], reverse=True)[:n]

    # 输出前 n 个 CPU 占用率最高的进程
    print(f"CPU 占用率最高的前 {n} 个进程:")
    for proc in top_processes:
        print(f"进程 ID: {proc['pid']}, 进程名称: {proc['name']}, CPU 占用率: {proc['cpu_percent']:.2f}%")


if __name__ == "__main__":
    get_top_cpu_processes()
# try:
#     while True:
#         # 获取 CPU 使用率
#         cpu_usage = psutil.cpu_percent(interval=1)  # interval 设置为 1 秒，获取平均值
#         print(f"CPU 使用率: {cpu_usage}%")
#
#         # 获取内存占用情况
#         memory_info = psutil.virtual_memory()
#         memory_usage = memory_info.percent
#         total_memory = memory_info.total / (1024 ** 3)  # 总内存，单位为 GB
#         used_memory = memory_info.used / (1024 ** 3)  # 已使用内存，单位为 GB
#         available_memory = memory_info.available / (1024 ** 3)  # 可用内存，单位为 GB
#
#         print(f"内存使用率: {memory_usage}%")
#         print(f"总内存: {total_memory:.2f} GB")
#         print(f"已使用内存: {used_memory:.2f} GB")
#         print(f"可用内存: {available_memory:.2f} GB")
#
#         # 等待一秒
#         time.sleep(1)
#
# except KeyboardInterrupt:
#     print("程序已停止.")